타겟 인코딩
📋 문서 버전
이 문서는 2개의 버전이 있습니다. 현재 최신 버전을 보고 있습니다.
타겟 인코딩
개요
타겟 인코딩(Target)은 머신러닝과 과학 분야에서 범주형 변수(C Variable)를 수형 변수로 변환하는 고급 인딩 기법 중입니다. 이 방법은주형 변수의 범주(Category)를 해당 범에 속하는 타 변수(Target Variable)의계적 요약(예: 평균, 중값, 분산)으로 대체하는식입니다. 특히귀 또는 분류에서 범주형 피를 모델에 효과적으로 통합할 필요가 있을 때용하게 사용됩니다.
타겟 인코딩은 단순한 원-핫 인코딩(One-Hot Encoding)이나 레이블 인코딩(Label Encoding)보다 더 많은 정보를 포함할 수 있기 때문에, 모델의 성능을 향상시키는 데 기여할 수 있습니다. 하지만 잘못 사용하면 데이터 누수(Data Leakage) 및 과적합(Overfitting) 문제가 발생할 수 있으므로 주의가 필요합니다.
타겟 인코딩의 원리
타겟 인코딩은 각 범주형 값에 대해 타겟 변수의 기대값을 계산하여 그 값을 피처 값으로 사용하는 방식입니다. 예를 들어, 이진 분류 문제에서 타겟이 0 또는 1일 경우, 범주 A에 속하는 샘플들의 타겟 평균(즉, 1의 비율)을 범주 A의 인코딩 값으로 할당합니다.
기본 예시
다음과 같은 데이터가 있다고 가정합시다:
지역 | 타겟 |
---|---|
서울 | 1 |
부산 | 0 |
서울 | 1 |
대구 | 1 |
부산 | 1 |
서울 | 0 |
- 서울: 타겟 평균 = (1 + 1 + 0) / 3 = 0.666
- 부산: 타겟 평균 = (0 + 1) / 2 = 0.5
- 대구: 타겟 평균 = 1 / 1 = 1.0
이제 '지역' 피처를 다음과 같이 인코딩할 수 있습니다:
지역 | 인코딩 값 |
---|---|
서울 | 0.666 |
부산 | 0.5 |
대구 | 1.0 |
이 값들은 모델의 입력으로 사용될 수 있습니다.
타겟 인코딩의 장점
-
고차원 문제 해결: 범주 수가 매우 많은 경우(예: 도시명, 제품 ID 등), 원-핫 인코딩은 차원이 급격히 증가하여 "차원의 저주" 문제가 발생할 수 있습니다. 타겟 인코딩은 단일 수치값으로 변환하므로 차원 증가를 방지합니다.
-
의미 있는 수치화: 각 범주가 타겟과의 관계를 반영하는 수치로 변환되므로, 모델이 범주 간의 중요도나 경향성을 더 쉽게 학습할 수 있습니다.
-
비선형 관계 포착: 범주와 타겟 간의 관계가 단순하지 않을 때, 타겟 인코딩은 이 관계를 효과적으로 요약할 수 있습니다.
주의사항 및 문제점
1. 데이터 누수 (Data Leakage)
타겟 인코딩을 전체 데이터셋에 대해 수행하면, 검증 데이터나 테스트 데이터의 정보가 훈련 단계에서 유출될 수 있습니다. 이는 모델의 일반화 성능을 과대평가하게 만듭니다.
해결 방법: - 교차 검증 기반 인코딩(Cross-validation based encoding): 훈련 데이터를 폴드로 나누고, 각 폴드에서 타겟 인코딩을 수행할 때 다른 폴드의 정보만 사용. - 리드-인(Leave-one-out): 특정 샘플을 제외한 나머지 데이터로 인코딩 값을 계산하여 그 샘플에 적용.
2. 소수의 샘플을 가진 범주에 대한 과적합
범주 내 샘플 수가 적을 경우, 인코딩 값이 노이즈에 민감해져 과적합될 수 있습니다.
해결 방법: - 스무딩(Smoothing): 전체 타겟 평균과 범주별 평균을 가중 평균하여 안정성을 높임.
예:
$$
\text{Encoded Value} = \frac{(\text{count} \times \text{category\_mean}) + (\text{prior} \times \text{global\_mean})}{\text{count} + \text{prior}}
$$
여기서 prior
는 정규화 강도를 조절하는 하이퍼파라미터입니다.
구현 예시 (Python)
import pandas as pd
from sklearn.model_selection import KFold
import numpy as np
def target_encode(train_df, test_df, cat_cols, target_col, alpha=5.0):
"""
타겟 인코딩 함수 (스무딩 및 CV 기반)
"""
train_encoded = train_df.copy()
test_encoded = test_df.copy()
global_mean = train_df[target_col].mean()
kf = KFold(n_splits=5, shuffle=True, random_state=42)
for col in cat_cols:
# 테스트 데이터: 전체 훈련 데이터 기반 인코딩
temp_df = train_df.groupby(col)[target_col].agg(['mean', 'count'])
temp_df['smoothed'] = (temp_df['mean'] * temp_df['count'] + global_mean * alpha) / (temp_df['count'] + alpha)
test_encoded[col + '_target'] = test_encoded[col].map(temp_df['smoothed'])
test_encoded[col + '_target'].fillna(global_mean, inplace=True)
# 훈련 데이터: CV 기반 리드-인 스타일 인코딩
train_encoded[col + '_target'] = 0.0
for train_idx, val_idx in kf.split(train_df):
tr, val = train_df.iloc[train_idx], train_df.iloc[val_idx]
temp_map = tr.groupby(col)[target_col].agg(['mean', 'count'])
temp_map['smoothed'] = (temp_map['mean'] * temp_map['count'] + global_mean * alpha) / (temp_map['count'] + alpha)
val_encoded = val[col].map(temp_map['smoothed'])
val_encoded.fillna(global_mean, inplace=True)
train_encoded.loc[val_idx, col + '_target'] = val_encoded
return train_encoded, test_encoded
관련 기법
- 원-핫 인코딩(One-Hot Encoding): 범주를 이진 벡터로 변환. 고차원 문제 발생 가능.
- 레이블 인코딩(Label Encoding): 범주에 정수값 할당. 순서 정보를 잘못 유도할 수 있음.
- 카운트 인코딩(Count Encoding): 각 범주의 출현 빈도를 사용.
- 하이브리드 인코딩: 타겟 인코딩과 다른 기법을 조합.
참고 자료 및 관련 문서
- Scikit-learn Documentation
- Target Encoding in Practice - Kaggle Notebooks
- Micci-Barreca, D. (2001). A Preprocessing Scheme for High-Cardinality Categorical Attributes in Classification and Prediction Problems. ACM SIGKDD Explorations.
타겟 인코딩은 고차원 범주형 데이터를 다룰 때 강력한 도구이지만, 신중한 구현과 검증이 필수적입니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.